package com.msmall.community.team.service;

import java.io.File;
import java.util.List;

import com.msmall.base.pager.PaginationSupport;
import com.msmall.base.service.BaseManager;
import com.msmall.community.team.model.Team;
import com.msmall.community.team.model.TeamProperty;
import com.msmall.community.team.model.TeamTopicModel;
import com.msmall.community.team.model.TeamUser;

public interface TeamManager extends BaseManager<Team, Long>{
	
	/**
	 * 检查用户能否创建组，目前只检查创建数量限制
	 * @param userid
	 */
	public boolean canCreateTeam(Long userid);
	
	/**
	 * 通过用户ID和职位，查找到此用户所在组
	 * eg : postion = TeamUser.Position_chairman用户所有创建的组
	 * @param userid
	 */
	public List<Team> loadTeamsByUserPosition(Long userid, Integer position) throws Exception;
	
	/**
	 * 通过用户ID，查找到此用户所在组
	 * @param userid
	 */
	public List<Team> loadTeamsByUserStatus(Long userid, Integer status) throws Exception;
	/**
	 * 申请创建组; 
	 * @param userid 申请人
	 * @param name组名称
	 * @param description 组描述
	 * @author zhzy
	 */
	public boolean createTeam(Long userid, String name, String description);
	
	/**
	 * 验证组信息是否合法
	 *  0合法；1 组名已经存在；2组名不合法; 3组名太短；4组名太长；5组描述不合法；6组描述太短；7组描述太长
	 */
	public int validateTeam(Team team);
	
	/**
	 * 更新组信息，只能更新组名，组描述,只有创建者有此权限
	 * 0 修改成功 1 权限不够 9其他错误
	 */
	public int updateTeam(Long userid, Long teamid, String name, String description);
	/**
	 * 只有创建者能修改组LOGO
	 */
	public Team saveTeamLogo(File logo, String logoFileName, String uat, Long userid, Long teamid);
	/**
	 * 前台创建者销毁组
	 * 0 修改成功 1 权限不够 9其他错误
	 */
	public int destroyTeam(Long userid, Long teamid);
	/**
	 * 后台管理员销毁组
	 * 0 修改成功 1 权限不够 9其他错误
	 */
	public int adminDestroyTeam(Long userid, Long teamid);
	/**
	 * 管理员审核 申请创建的组是否能够成立
	 * @param userid
	 * @param teamid
	 * @param audit true成立
	 * @author zhzy
	 */
	public boolean adminAuditTeam(Long userid, Long teamid, boolean audit);
	
	/**
	 * 设置组访问权限，只有创建者可以设置
	 * 0 修改成功 1 权限不够 9其他错误
	 * @author zhzy
	 */
	public int setTeamVisit(Long userid, Long teamid, String value);
	/**
	 * 获得组的访问设置，如果没有，默认所有人都可以访问
	 * @param teamid
	 */
	public TeamProperty getTeamVisit(Long teamid);
	
	/**
	 * 设置组成员申请是否需要审核，只有创建者可以设置
	 *  0 修改成功 1 权限不够 9其他错误
	 * @author zhzy
	 */
	public int setTeamApplyAudit(Long userid, Long teamid, String value);
	
	/**
	 * 获得 组成员申请是否需要审核， 如果没有，默认添加一天数据，并且值为不需要审核
	 * @param teamid
	 * @return
	 * @author zhzy
	 */
	public TeamProperty getTeamApplyAudit(Long teamid);
	/**
	 * 设置组的共享组，只有创建者可以设置
	 *  0 修改成功 1 权限不够 9其他错误
	 * @author zhzy
	 */
	public int addSharedTeam(Long userid, Long teamid, Long sharedid);
	
	/**
	 * 获得组的授权访问用户
	 * @param teamid
	 * @return
	 * @author zhzy
	 */
	public TeamProperty getAuthrizedUser(Long teamid);
	
	/**
	 * 设置组的授权访问用户，只有创建者和管理者可以设置
	 *  0 修改成功 1 权限不够 9其他错误
	 * @author zhzy
	 */
	public int addAuthrizedUser(Long userid, Long teamid, Long authid);
	
	/**
	 * 获得组的共享组
	 * @param teamid
	 * @return
	 * @author zhzy
	 */
	public TeamProperty getSharedTeam(Long teamid);

	public TeamUser getTeamUser(Long userid, Long teamid);
	/**
	 * 申请入组
	 * 首先检查是否已经申请了，如果已经申请了，如果状态是：
	 * 1正常 不处理
	 * 2申请中 不处理 
	 * 3 拒绝 ,重新改为申请
	 * 4受邀请 ，改为1正常状态
	 * 9被屏蔽 ，不处理
	 */
	public TeamUser join(Long userid, Long teamid, String applyPaper);
	
	/**
	 * 组管理员审核用户的申请审核用户的申请
	 * 0 修改成功 1 权限不够 9其他错误
	 * @param userid审核人
	 * @param tuid TeamUser记录
	 * @param audit true通过 false 不通过
	 * @author zhzy
	 */
//	public int audit(Long userid, Long tuid, boolean audit);
	
	/**
	 * 组长，副组长修改组员信息, 仅修改职位/状态/组昵称
	 */
	public void saveTeamUser(Long managerid, TeamUser teamUser);
	
	/**
	 *  用户修改在组中的昵称
	 */
	public TeamUser saveTeamUserNickname(Long userid, Long teamid, String nickname);
	
	/**
	 *  组长/副组长才具有权限邀请
	 * 邀请用户加入组，目前只支持按昵称邀请，如果存在多个人同一个昵称，则全部邀请
	 * 邀请后发送社区消息到用户系统MESSAGE
	 * @param userid 邀请人ID
	 * @param invite 被邀请人信息
	 */
	public void inviteUser(Long userid, Long teamid, String invite);
	
	/**
	 * 用户同意加入组
	 */
	public void inviteAgress(Long userid, Long teamid, Long messageid);
	
	/**
	 * 用户不同意加入组
	 */
	public void inviteReject(Long userid, Long teamid, Long messageid);
	/**
	 *  退组
	 */
	public boolean leave(Long userid, Long teamid);
	
	/**
	 * 获得组的创建者 
	 */
	public TeamUser getTeamCreator(Long teamid);
	/**
	 * 获得组的管理者，并且状态是TEAM.STATUS_NORMAL 
	 * creator: true 包括创建者 false:不包括创建者 
	 */
	public List<TeamUser> getTeamManagers(Long teamid, boolean creator);
	/**
	 * 获得组的普通成员，并且状态是TEAM.STATUS_NORMAL 不包括创建者和管理者 
	 */
	public List<TeamUser> getTeamMembers(Long teamid);
	/**
	 * 根据组员状态获得组用户信息
	 * type TeamUser.STATUS_xx,如果为-1则获得所有用户
	 * @author zhzy
	 */
	public List<TeamUser> getMembers(Long teamid, int type);
	
	/**
	 * 检查用户对组的某个属性是否有权限;目前KEY 只为TeamProperty.KEY_VISIT
	 * @param userid
	 * @param teamid
	 * @param key
	 * @author zhzy
	 */
	public boolean checkAuthrized(Long userid, Long teamid, String key);
	
	/**
	 * 获得用户在组中的关系;首先判断用户是否是组员，然后判断用户状态是否正常
	 * 如果是组成员 并且状态正常 返回TeamUser.POSITION_
	 * 如果陌生人 返回 -1
	 * 如果状态不正常 返回 -2
	 */
	public int getPosition(Long userid, Long teamid);
	/**
	 * 在组内发表话题 
	 * @author zhzy
	 */
	public void newTeamTopic(Long userid, Long teamid,Short original, String title, String content, String userAgentType, String sharePublic, Long boardid, boolean sharedTeam);
	
	/**
	 *  组长/副组长删除组话题
	 *  enabled修改， 如果发布到社区，不影响社区应用 
	 */
	public void deleteTeamTopic(Long userid, Long ttid);
	/**
	 *  获得组的话题列表，包括由分享获得的共享话题, page.item TeamTopicModel
	 */
	public void getPaginationByTeam(PaginationSupport page, Long teamid);
	
	public TeamTopicModel getByTeamTopicid(Long ttid);
	
	/**
	 * 获得所有可用组
	 * @param page
	 * @author zhzy
	 */
	public void getAvaliableTeam(PaginationSupport page);
	/**
	 * 通过组名获得组
	 */
	public Team loadTeamByName(String name);
	
	/**
	 * 获得一个组的所有属性
	 */
	public List<TeamProperty> getAllProperties(Long teamid);
}
